package com.itheima.mapper;

import com.itheima.pojo.Dept;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

@Mapper //标识为mapper接口 底层会自动产生实现类对象--交给springIOC管理
public interface DeptMapper {

    //设计方法+sql(注解、xml书写)
    //如果 字段名和实体属性名不匹配   1:开启驼峰命名和下划线命名 自动映射  2:使用别名 3:使用ResultMap 进行手动映射
//    @Select("select id, name, create_time createTime, update_time updateTime from dept order by update_time")
//    @Results({
//            @Result(column = "create_time", property = "createTime"),
//            @Result(column = "update_time", property = "updateTime")
//    })
    @Select("select * from dept order by update_time")
    List<Dept> findAll();

    // 如何将形参接收到数据 设置到 sql语句中  占位符 #{} 相当于 ?
    // #{} 括号里面写参数名字
    // 面试题 问 #{} ${} 区别
    //  #{} 占位符 底层是预处理 安全效率高 如果占位是字符串数据 自动拼接 ' ' 字符串的格式 不适合 表示 表名 字段名
    //  ${} 拼接符 拼接sql语句 底层没有预处理 效率低  只是完成拼接sql语句 不会自动加'' 适合表示表名 字段名
    @Delete("delete from dept where id=${id}")
    void delete(Integer id);

    // 添加    要的参数 在对象中可以 直接使用#{属性名} 取值  属性名--实体类名中名称
    @Insert("insert into dept(name,create_time,update_time) values(#{name},#{createTime},#{updateTime})")
    void add(Dept dept);

    @Select("select * from dept where id=#{id}")
    Dept getById(Integer id);

//    @Update("update dept set name=#{name},update_time=#{updateTime} where id=#{id}")
//    void update(Dept dept);

    /*
      优化代码
        实现 更新时 动态修改
          如果条件参数 不为空 就修改
                      为空 不修改
          在sql语句体现就是 不为空 就拼接  为空 不拼接
       想要实现动态sql 需要将sql写在xml上
     */
    void update(Dept dept);
    /*
      xml开发 规范
         1:创建 XxxMapper.xml文件  同包同名 引入对应的约束
         2:xml的 namespace属性 要写 接口的 全限定类名
         3:写出与方法一致的 sql标签
     */


    @Select("select id,name from dept")
//    List<Map<字段名,属性值>>  list2();
    List<Map<String,Object>>  list2();
    /*
     返回值写  Dept  和写 Map是一样的
     */



}
